package com.seqb.common.disruptor;

import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.dsl.Disruptor;

import java.util.concurrent.Executors;

/**
 * @author lilinshen
 * @title 请填写标题
 * @description 请填写相关描述
 * @date 2020/5/11
 */
public class TestMain {

    /**
     * Disruptor开发步骤
     *
     * 1：定义Event-队列中需要处理的元素。
     * 在Disruptor他是每一个消息都认为是一个事件，在他这个概念里就是一个事件，所以在这个环形队
     * 列里面存的是一个一个的Event。
     * 2：定义Event工厂，用于填充队列
     * 那这个Event怎么产生，就需要指定Event的工厂
     * 3：定义EventHandler(消费者)，处理容器中的元素
     * 那这个Event怎么消费呢，就需要指定Event的消费者EventHandler。
     */
    public static void main(String[] args) {

        /**
         * 首先把EvenFactory给他初始化了new LongEventFactory，我们这个环应该是2的N次方1024，
         * 然后new一个Disruptor出来，需要指定这么几个参数：
         *      factory产生消息的工厂；
         *      bufferSize是指定这个环大小到底是多少；
         *      defaultThreadFactory线程工厂，指的是当他要产生消费者的时候，当要调用这个消费者的时候他是在一个特定的线程里执行的，这个线程就是通过defaultThreadFactory来产生；
         * 继续往下看，当我们拿到这个消息之后怎么进行处理啊，我们就用这个LongEventHandler来处理。
         * 然后start，当start之后一个环起来了，每个环上指向的这个LongEvent也得初始化好，内存分配好了，整个就安安静静的等待着生产者的到来。
         * 看生产者的代码，long sequence = ringBuffer.next()，通过next找到下一个可用的位置，最开始这个
         * 环是空的，下一个可用的位置是0这个位置，拿到这个位置之后直接去ringBuffer里面get(0)这个位置上
         * 的event。如果说你要是追求效率的极致，你应该是一次性全部初始化好，你get的时候就不用再去判
         * 断，如果你想做一个延迟，很不幸的是你每次都要做判断是不是初始化了。
         * get的时候就是拿到一个event，这个是我们new出来的默认的，但是我们可以改里面的event.setValue(值...)，填好数据之后
         * ringBuffer.publish发布生产
         */
        LongEventFactory factory = new LongEventFactory();
        int bufferSize = 1024;

        Disruptor<LongEvent> disruptor = new Disruptor<LongEvent>(factory, bufferSize, Executors.defaultThreadFactory());

        disruptor.handleEventsWith(new LongEventHandler());

        disruptor.start();

        RingBuffer<LongEvent> ringBuffer = disruptor.getRingBuffer();

        long sequence = ringBuffer.next();

        try {
            LongEvent event = ringBuffer.get(sequence);

            event.setValue(8888L);

        } finally {
            ringBuffer.publish(sequence);
        }

    }

}
